package cn.yougou.serviceImpl;

import cn.yougou.common.CalculateUtil;
import cn.yougou.common.DateUtil8;
import cn.yougou.common.DtoUtil;
import cn.yougou.dto.Dto;
import cn.yougou.mapper.YgCartMapper;
import cn.yougou.mapper.YgCommodityMapper;
import cn.yougou.mapper.YgCommodityProductMapper;
import cn.yougou.pojo.YgCart;
import cn.yougou.pojo.YgCommodity;
import cn.yougou.pojo.YgCommodityProduct;
import cn.yougou.service.shopcart.YgCartService;
import cn.yougou.service.shopcart.YgCommodityService;
import cn.yougou.vo.YgCommodityVo;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import java.util.List;

/**
 * (YgCart)表服务实现类
 * @author 白杰崇
 * @since 2021-01-07 16:34:40
 */
@Service
public class YgCartServiceImpl implements YgCartService {

    @Autowired
    private YgCartMapper ygCartMapper;

    @Autowired
    private YgCommodityMapper ygCommodityMapper;

    @Autowired
    private YgCommodityProductMapper ygCommodityProductMapper;

    /**
     * 添加购物车
     *
     * @param ygCart 实例对象
     * @return 实例对象
     */
    @Override
    public Dto create(YgCart ygCart) {
        int config = 0;
        //1 判断该规格货品用户是否已经加入过购物车
        YgCart cartTwo = new YgCart();
        cartTwo.setProductid(ygCart.getProductid());
        List<YgCart> cartList = ygCartMapper.queryAll(cartTwo);
        //2 如果已经添加过则将购物车该规格货品数量+1
        if(!cartList.isEmpty()){
            //2.2 拿到该规格货品的数量，然后+1
            cartTwo = cartList.get(0);
            cartTwo.setNumber(cartTwo.getNumber()+1); //件数+1
            //更新修改时间即可
            cartTwo.setUpdatetime(DateUtil8.getNowTime_EN());
            config = ygCartMapper.update(cartTwo);
        }else{
            //3 如果没添加过则进行添加操作
            ygCart.setAddtime(DateUtil8.getNowTime_EN()); //新增时间
            ygCart.setUpdatetime(DateUtil8.getNowTime_EN()); //修改时间
            ygCart.setDeleted(true);   //删除逻辑
            config = ygCartMapper.insert(ygCart);
        }
        if(config > 0){
            return DtoUtil.returnSuccess();
        }
        return DtoUtil.returnFail("添加失败", "50001");
    }

    /**
     * 查询用户购物车全部商品
     * @param ygCart
     * @return
     */
    @Override
    public Dto queryAll(YgCart ygCart) {
        //1 获取到该用户的购物车数据
        List<YgCart> cartList = ygCartMapper.queryAll(ygCart);
        //2 判断用户是否全选
        boolean allChecked = true;
        for (YgCart cartItem : cartList) {
            if(!cartItem.getChecked()){ //取反
                allChecked = false;
                break;
            }
        }
        //3 获得选中商品的总优惠金额
        double discountMoney = this.getDiscount(ygCart.getUserid());
        //4 返回的： 购物车商品列表，是否全选，选中商品的优惠总金额
        return DtoUtil.returnDataListSuccess(cartList,allChecked,discountMoney);
    }

    /**
     * 修改购物车:加数量/选中
     * @param ygCart
     * @return
     */
    @Override
    public Dto amendCart(YgCart ygCart) {
        //1 更改数据库 & 不更改修改时间，仿某宝
        int config = ygCartMapper.update(ygCart);
        if(config > 0){
            //2 获得选中商品的总优惠金额
            double discountMoney = this.getDiscount(ygCart.getUserid());
            return DtoUtil.returnDataSuccess(discountMoney);
        }
        return null;
    }

    /**
     * 全选/全反选
     * @param userId
     * @param checkedAll
     * @return
     */
    @Override
    public Dto selectAll(Integer userId, Boolean checkedAll) {
        //1 更改数据库
        int config = ygCartMapper.selectAll(userId, checkedAll);
        if(config > 0){
            //2 获得选中商品的总优惠金额
            double discountMoney = this.getDiscount(userId);
            return DtoUtil.returnDataSuccess(discountMoney);
        }
        return null;
    }

    /**
     * 通过主键删除购物车数据
     * @param ygCart
     * @return
     */
    @Override
    public Dto deleteById(YgCart ygCart) {
        //1 更改数据库
        int config = ygCartMapper.deleteById(ygCart.getId());
        if(config > 0){
            //2 获得选中商品的总优惠金额
            double discountMoney = this.getDiscount(ygCart.getUserid());
            return DtoUtil.returnDataSuccess(discountMoney);
        }
        return null;
    }

    /**
     * 清空购物车
     * @param userId
     * @return
     */
    @Override
    public int emptyCart(Integer userId) {
        return ygCartMapper.emptyCart(userId);
    }

    /**
     * 计算该用户选中商品的优惠金额
     * @return
     */
    public double getDiscount(Integer userId){
        //1 查询购物车中该用户选中状态的货品
        YgCart ygCart = new YgCart();
        ygCart.setUserid(userId);
        ygCart.setChecked(true);
        List<YgCart> selList = ygCartMapper.queryAll(ygCart);
        //2 根据该货品规格id查询出该规格的原价
        double discount = 0.0;
        for (YgCart cart : selList) {
            //3 计算优惠的价格且将优惠价格相加返回
            //3.1根据规格id查询出该规格货品的原价
            YgCommodityProduct ygCp = ygCommodityProductMapper.queryById(cart.getProductid());
            //3.2调用工具类得到该货品的优惠金额
            //3.3原价减去折扣价 乘以件数 得出该商品优惠总金额
            discount += CalculateUtil.getDiscount(ygCp.getPrice(),cart.getPrice(),cart.getNumber());
        }
        return discount;
    }


    /**
     * 获取用户购物车全部选中的商品
     * @param userId
     * @return
     */
    @Override
    public Dto submitOrder(Integer userId) {
        if(null != userId){
            YgCart ygCart = new YgCart();
            ygCart.setUserid(userId); //用户id
            ygCart.setChecked(true); // 选中状态的商品
            List<YgCart> cartList = ygCartMapper.queryAll(ygCart);
            return DtoUtil.returnDataSuccess(cartList);
        }
        return null;
    }

}